#ifndef __BSP_SPI_CORE_H
#define __BSP_SPI_CORE_H

/*
1）第一个参数为函数指针，主要功能的实现spi外设片选的选择（拉低/拉高）功能；
2）第二个参数为spi总线相关的结构体指针，主要是底层相关收据收发的的功能，具体继续往下看。
*/
struct spi_dev_device
{
    void (*spi_cs)(unsigned char state);
    struct spi_bus_device *spi_bus;
};

struct spi_dev_message
{
    const void *send_buf;
    void *recv_buf;
    int length;
    unsigned char cs_take : 1;
    unsigned char cs_release : 1;
};
/*
1）第一个参数是函数指针，为spi总线收发函数，这部分就是我们平常写裸机代码时候写到的，只是这里把它放在一个结构体里面，以函数指针的方式实现；
   这样的好处是，上层接口不变，更好其他MCU或者使用模拟spi时，只需修改此部分的函数实体，上层代码不需变动。
2）第二个参数，一个指针，表示具体物理spi，如stm32的SPI1、SPI2，或者模拟spi；
3）第三参数，数据宽度，一般是8bit或者16bit。
*/
struct spi_bus_device
{
    int (*spi_bus_xfer)(struct spi_dev_device *spi_bus, struct spi_dev_message *msg);
    struct ops_spi_bus_device *spi_phy;
    unsigned char data_width;
};

/*给外部调用的spi函数*/
int spi_send_then_recv(struct spi_dev_device *spi_dev, const void *send_buff, unsigned short send_size, void *recv_buff, unsigned short recv_size);
int spi_send_then_send(struct spi_dev_device *spi_dev, const void *send_buff1, unsigned short send_size1, const void *send_buff2, unsigned short send_size2);
int spi_send_recv(struct spi_dev_device *spi_dev, const void *send_buff, void *recv_buff, unsigned short data_size);
int spi_send(struct spi_dev_device *spi_dev, const void *send_buff, unsigned short send_size);

/*
1）spi_send_then_recv，标准spi，常规操作，发送完一帧再接收，如读取某芯片寄存器的值；
2）spi_send_then_send，标准spi，常规操作，发送完一帧再发送，如向某芯片寄存器（地址）写入数据；
3）spi_send_recv，非标spi，具体看芯片时序图，产生时钟信号，发送完成的同时，也接收完成；第二种情况是，只接收，发送动作只是用来产生时钟信号，如一些AD芯片；
4）spi_send，标准或非标spi都使用，只发送无返回值或者无须理会返回值，如spi LCD屏。
*/
#endif
